EFCore 初始化配置

EFCore基础配置与数据迁移cli

EFCore 初始化配置

EFCore官方教程

  1. ef-mvc 教程
  2. ef-mvc 教程 github 源码

基础配置

  1. 引入依赖包

    • MySql.Data.EntityFrameworkCore (官方,很多未完善)
    • Pomelo.EntityFrameworkCore.MySql (Pomelo,官方推荐)
  2. 添加上下文类和实体类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    > public class SchoolContext : DbContext
    > {
    > public SchoolContext(DbContextOptions<SchoolContext> options) : base(options)
    > {
    >
    > }
    >
    > public DbSet<Course> Courses { get; set; }
    > public DbSet<Enrollment> Enrollments { get; set; }
    > public DbSet<Student> Students { get; set; }
    >
    > protected override void OnModelCreating(ModelBuilder modelBuilder)
    > {
    > modelBuilder.Entity<Course>().ToTable("Course");
    > modelBuilder.Entity<Enrollment>().ToTable("Enrollment");
    > modelBuilder.Entity<Student>().ToTable("Student");
    > }
    > }
    >
  3. 上下文的依赖注入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    > public void ConfigureServices(IServiceCollection services)
    > {
    > services.AddDbContext<SchoolContext>(options =>
    > {
    > options.UseMySQL(Configuration.GetConnectionString("DefaultConnection"));
    > });
    > services.AddMvc();
    > }
    >
  4. 测试数据初始化

    EnsureCreated 这个方法确保数据库被创建

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    public static class DbInitializer
    {
    public static void Initialize(SchoolContext context)
    {
    context.Database.EnsureCreated();

    // Look for any students.
    if (context.Students.Any())
    {
    return; // DB has been seeded
    }

    var students = new Student[]
    {
    new Student{FirstMidName="Carson",LastName="Alexander",EnrollmentDate=DateTime.Parse("2005-09-01")},
    new Student{FirstMidName="Meredith",LastName="Alonso",EnrollmentDate=DateTime.Parse("2002-09-01")},
    new Student{FirstMidName="Arturo",LastName="Anand",EnrollmentDate=DateTime.Parse("2003-09-01")},
    new Student{FirstMidName="Gytis",LastName="Barzdukas",EnrollmentDate=DateTime.Parse("2002-09-01")},
    new Student{FirstMidName="Yan",LastName="Li",EnrollmentDate=DateTime.Parse("2002-09-01")},
    new Student{FirstMidName="Peggy",LastName="Justice",EnrollmentDate=DateTime.Parse("2001-09-01")},
    new Student{FirstMidName="Laura",LastName="Norman",EnrollmentDate=DateTime.Parse("2003-09-01")},
    new Student{FirstMidName="Nino",LastName="Olivetto",EnrollmentDate=DateTime.Parse("2005-09-01")}
    };
    foreach (Student s in students)
    {
    context.Students.Add(s);
    }
    context.SaveChanges();

    var courses = new Course[]
    {
    new Course{CourseID=1050,Title="Chemistry",Credits=3},
    new Course{CourseID=4022,Title="Microeconomics",Credits=3},
    new Course{CourseID=4041,Title="Macroeconomics",Credits=3},
    new Course{CourseID=1045,Title="Calculus",Credits=4},
    new Course{CourseID=3141,Title="Trigonometry",Credits=4},
    new Course{CourseID=2021,Title="Composition",Credits=3},
    new Course{CourseID=2042,Title="Literature",Credits=4}
    };
    foreach (Course c in courses)
    {
    context.Courses.Add(c);
    }
    context.SaveChanges();

    var enrollments = new Enrollment[]
    {
    new Enrollment{StudentID=1,CourseID=1050,Grade=Grade.A},
    new Enrollment{StudentID=1,CourseID=4022,Grade=Grade.C},
    new Enrollment{StudentID=1,CourseID=4041,Grade=Grade.B},
    new Enrollment{StudentID=2,CourseID=1045,Grade=Grade.B},
    new Enrollment{StudentID=2,CourseID=3141,Grade=Grade.F},
    new Enrollment{StudentID=2,CourseID=2021,Grade=Grade.F},
    new Enrollment{StudentID=3,CourseID=1050},
    new Enrollment{StudentID=4,CourseID=1050},
    new Enrollment{StudentID=4,CourseID=4022,Grade=Grade.F},
    new Enrollment{StudentID=5,CourseID=4041,Grade=Grade.C},
    new Enrollment{StudentID=6,CourseID=1045},
    new Enrollment{StudentID=7,CourseID=3141,Grade=Grade.A},
    };
    foreach (Enrollment e in enrollments)
    {
    context.Enrollments.Add(e);
    }
    context.SaveChanges();
    }
    }

数据迁移

dotnet-ef命令行官方文档(.NET Core CLI)

  1. 添加命令行 Nuget

    Microsoft.EntityFrameworkCore.Tools.DotNet 用于 dotnet-ef 命令
    Microsoft.DotNet.Watcher.Tools 这里用于 donet watch run,开发时保存即编译,无需重新run,这里和数据迁移无关

    1
    2
    3
    4
    <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.1"/>
    <DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="2.0.0"/>
    </ItemGroup>
  2. 创建一个数据迁移类

    1
    dotnet ef migrations add InitialCreate
  3. 应用迁移到数据库

    1
    dotnet ef database update
  4. XXContextModelSnapshot

    这个类始终与所有迁移同步,如果要撤销迁移,使用 dotnet ef migrations remove 撤销最后一个迁移,而不能删除 <timestamp>_<migrationname>.cs 文件,否则会导致此类 XXContextModelSnapshot 与剩余迁移不同步。